<?xml version="1.0" encoding="ASCII"?>
<component:hashComponent xmlns:component="http://www.example.org/HashComponent">
  <package>bt.solve</package>
  <using>adi</using>
  <using>common.axis</using>
  <using>common.problem_size</using>
  <using>common.solve</using>
  <using>common</using>
  <using>adi.solve</using>
  <using>common.direction</using>
  <using>common.data</using>
  <using>adi.data</using>
  <using>common.datapartition</using>
  <using>common.topology</using>
  <using>environment</using>
  <using>bt.solve</using>
  <using>common.interactionpattern</using>
  <kind>Computation</kind>
  <name>Solver</name>
  <parameter>
    <identifier>instance_type</identifier>
    <variable>I</variable>
    <constraint>
      <componentConstraint>common.problem_size.Instance</componentConstraint>
      <parameter>
        <identifier>class</identifier>
        <variable>C</variable>
        <constraint>
          <componentConstraint>common.problem_size.Class</componentConstraint>
        </constraint>
      </parameter>
    </constraint>
  </parameter>
  <parameter>
    <identifier>axis</identifier>
    <variable>DIR</variable>
    <constraint>
      <componentConstraint>common.axis.Axis</componentConstraint>
    </constraint>
  </parameter>
  <parameter>
    <identifier>class</identifier>
    <variable>C</variable>
    <constraint>
      <componentConstraint>common.problem_size.Class</componentConstraint>
    </constraint>
  </parameter>
  <parameter>
    <identifier>method</identifier>
    <variable>MTH</variable>
    <constraint>
      <componentConstraint>common.solve.SolvingMethod</componentConstraint>
    </constraint>
  </parameter>
  <innerComponent>
    <kind>Data</kind>
    <identifier>output_buffer_backward</identifier>
    <type>
      <componentName>common.Buffer</componentName>
    </type>
    <access>private</access>
    <exportActions>true</exportActions>
  </innerComponent>
  <innerComponent>
    <kind>Computation</kind>
    <identifier>iteration_control_forward</identifier>
    <type>
      <componentName>adi.solve.IterationControl</componentName>
      <parameter>
        <identifier>direction</identifier>
        <constraint>
          <componentConstraint>common.direction.Forward</componentConstraint>
        </constraint>
      </parameter>
    </type>
    <access>public</access>
    <exportActions>true</exportActions>
  </innerComponent>
  <innerComponent>
    <kind>Computation</kind>
    <identifier>iteration_control_backward</identifier>
    <type>
      <componentName>adi.solve.IterationControl</componentName>
      <parameter>
        <identifier>direction</identifier>
        <constraint>
          <componentConstraint>common.direction.Backward</componentConstraint>
        </constraint>
      </parameter>
    </type>
    <access>public</access>
    <exportActions>true</exportActions>
  </innerComponent>
  <innerComponent>
    <kind>Data</kind>
    <identifier>backsub_info</identifier>
    <type>
      <componentName>common.data.Field</componentName>
    </type>
    <access>public</access>
    <exportActions>true</exportActions>
  </innerComponent>
  <innerComponent>
    <kind>Data</kind>
    <identifier>problem_data</identifier>
    <type>
      <componentName>adi.data.ProblemDefinition</componentName>
      <parameter>
        <identifier>instance_type</identifier>
        <variable>I</variable>
        <constraint>
          <componentConstraint>common.problem_size.Instance</componentConstraint>
          <parameter>
            <identifier>class</identifier>
            <variable>C</variable>
            <constraint>
              <componentConstraint>common.problem_size.Class</componentConstraint>
            </constraint>
          </parameter>
        </constraint>
      </parameter>
      <parameter>
        <identifier>class</identifier>
        <variable>C</variable>
        <constraint>
          <componentConstraint>common.problem_size.Class</componentConstraint>
        </constraint>
      </parameter>
    </type>
    <access>public</access>
    <exportActions>true</exportActions>
  </innerComponent>
  <innerComponent>
    <kind>Environment</kind>
    <identifier>cells_info</identifier>
    <type>
      <componentName>common.datapartition.MultiPartitionCells</componentName>
    </type>
    <access>public</access>
    <exportActions>true</exportActions>
  </innerComponent>
  <innerComponent>
    <kind>Data</kind>
    <identifier>input_buffer_forward</identifier>
    <type>
      <componentName>common.Buffer</componentName>
    </type>
    <access>private</access>
    <exportActions>true</exportActions>
  </innerComponent>
  <innerComponent>
    <kind>Data</kind>
    <identifier>lhsc</identifier>
    <type>
      <componentName>common.data.Field</componentName>
    </type>
    <access>public</access>
    <exportActions>true</exportActions>
  </innerComponent>
  <innerComponent>
    <kind>Data</kind>
    <identifier>output_buffer_forward</identifier>
    <type>
      <componentName>common.Buffer</componentName>
    </type>
    <access>private</access>
    <exportActions>true</exportActions>
  </innerComponent>
  <innerComponent>
    <kind>Environment</kind>
    <identifier>topology</identifier>
    <type>
      <componentName>common.topology.Ring</componentName>
    </type>
    <access>public</access>
    <exportActions>true</exportActions>
  </innerComponent>
  <innerComponent>
    <kind>Environment</kind>
    <identifier>mpi</identifier>
    <type>
      <componentName>environment.MPIDirect</componentName>
    </type>
    <access>public</access>
    <exportActions>true</exportActions>
  </innerComponent>
  <innerComponent>
    <kind>Data</kind>
    <identifier>input_buffer_backward</identifier>
    <type>
      <componentName>common.Buffer</componentName>
    </type>
    <access>private</access>
    <exportActions>true</exportActions>
  </innerComponent>
  <innerComponent>
    <kind>Computation</kind>
    <identifier>back_substitute</identifier>
    <type>
      <componentName>bt.solve.BackSubstitute</componentName>
      <publicInnerComponent>problem_data</publicInnerComponent>
      <publicInnerComponent>cells_info</publicInnerComponent>
      <publicInnerComponent>iteration_control_backward</publicInnerComponent>
      <publicInnerComponent>lhsc</publicInnerComponent>
      <publicInnerComponent>backsub_info</publicInnerComponent>
      <parameter>
        <identifier>instance_type</identifier>
        <variable>I</variable>
        <constraint>
          <componentConstraint>common.problem_size.Instance</componentConstraint>
          <parameter>
            <identifier>class</identifier>
            <variable>C</variable>
            <constraint>
              <componentConstraint>common.problem_size.Class</componentConstraint>
            </constraint>
          </parameter>
        </constraint>
      </parameter>
      <parameter>
        <identifier>axis</identifier>
        <variable>DIR</variable>
        <constraint>
          <componentConstraint>common.axis.Axis</componentConstraint>
        </constraint>
      </parameter>
      <parameter>
        <identifier>class</identifier>
        <variable>C</variable>
        <constraint>
          <componentConstraint>common.problem_size.Class</componentConstraint>
        </constraint>
      </parameter>
      <parameter>
        <identifier>method</identifier>
        <variable>MTH</variable>
        <constraint>
          <componentConstraint>common.solve.SolvingMethod</componentConstraint>
        </constraint>
      </parameter>
    </type>
    <access>private</access>
    <exportActions>true</exportActions>
  </innerComponent>
  <innerComponent>
    <kind>Computation</kind>
    <identifier>pack_back_sub_info</identifier>
    <type>
      <componentName>bt.solve.PackBackSubInfo</componentName>
      <publicInnerComponent>problem_data</publicInnerComponent>
      <publicInnerComponent>cells_info</publicInnerComponent>
      <publicInnerComponent>output_buffer_backward</publicInnerComponent>
      <publicInnerComponent>iteration_control_backward</publicInnerComponent>
      <parameter>
        <identifier>instance_type</identifier>
        <variable>I</variable>
        <constraint>
          <componentConstraint>common.problem_size.Instance</componentConstraint>
          <parameter>
            <identifier>class</identifier>
            <variable>C</variable>
            <constraint>
              <componentConstraint>common.problem_size.Class</componentConstraint>
            </constraint>
          </parameter>
        </constraint>
      </parameter>
      <parameter>
        <identifier>axis</identifier>
        <variable>DIR</variable>
        <constraint>
          <componentConstraint>common.axis.Axis</componentConstraint>
        </constraint>
      </parameter>
      <parameter>
        <identifier>class</identifier>
        <variable>C</variable>
        <constraint>
          <componentConstraint>common.problem_size.Class</componentConstraint>
        </constraint>
      </parameter>
      <parameter>
        <identifier>method</identifier>
        <variable>MTH</variable>
        <constraint>
          <componentConstraint>common.solve.SolvingMethod</componentConstraint>
        </constraint>
      </parameter>
    </type>
    <access>private</access>
    <exportActions>true</exportActions>
  </innerComponent>
  <innerComponent>
    <kind>Computation</kind>
    <identifier>pack_solve_info</identifier>
    <type>
      <componentName>bt.solve.PackSolveInfo</componentName>
      <publicInnerComponent>problem_data</publicInnerComponent>
      <publicInnerComponent>cells_info</publicInnerComponent>
      <publicInnerComponent>output_buffer_forward</publicInnerComponent>
      <publicInnerComponent>iteration_control_forward</publicInnerComponent>
      <publicInnerComponent>lhsc</publicInnerComponent>
      <parameter>
        <identifier>instance_type</identifier>
        <variable>I</variable>
        <constraint>
          <componentConstraint>common.problem_size.Instance</componentConstraint>
          <parameter>
            <identifier>class</identifier>
            <variable>C</variable>
            <constraint>
              <componentConstraint>common.problem_size.Class</componentConstraint>
            </constraint>
          </parameter>
        </constraint>
      </parameter>
      <parameter>
        <identifier>axis</identifier>
        <variable>DIR</variable>
        <constraint>
          <componentConstraint>common.axis.Axis</componentConstraint>
        </constraint>
      </parameter>
      <parameter>
        <identifier>class</identifier>
        <variable>C</variable>
        <constraint>
          <componentConstraint>common.problem_size.Class</componentConstraint>
        </constraint>
      </parameter>
      <parameter>
        <identifier>method</identifier>
        <variable>MTH</variable>
        <constraint>
          <componentConstraint>common.solve.SolvingMethod</componentConstraint>
        </constraint>
      </parameter>
    </type>
    <access>private</access>
    <exportActions>true</exportActions>
  </innerComponent>
  <innerComponent>
    <kind>Computation</kind>
    <identifier>unpack_back_sub_info</identifier>
    <type>
      <componentName>bt.solve.UnpackBackSubInfo</componentName>
      <publicInnerComponent>problem_data</publicInnerComponent>
      <publicInnerComponent>cells_info</publicInnerComponent>
      <publicInnerComponent>input_buffer_backward</publicInnerComponent>
      <publicInnerComponent>iteration_control_backward</publicInnerComponent>
      <publicInnerComponent>backsub_info</publicInnerComponent>
      <parameter>
        <identifier>instance_type</identifier>
        <variable>I</variable>
        <constraint>
          <componentConstraint>common.problem_size.Instance</componentConstraint>
          <parameter>
            <identifier>class</identifier>
            <variable>C</variable>
            <constraint>
              <componentConstraint>common.problem_size.Class</componentConstraint>
            </constraint>
          </parameter>
        </constraint>
      </parameter>
      <parameter>
        <identifier>axis</identifier>
        <variable>DIR</variable>
        <constraint>
          <componentConstraint>common.axis.Axis</componentConstraint>
        </constraint>
      </parameter>
      <parameter>
        <identifier>class</identifier>
        <variable>C</variable>
        <constraint>
          <componentConstraint>common.problem_size.Class</componentConstraint>
        </constraint>
      </parameter>
      <parameter>
        <identifier>method</identifier>
        <variable>MTH</variable>
        <constraint>
          <componentConstraint>common.solve.SolvingMethod</componentConstraint>
        </constraint>
      </parameter>
    </type>
    <access>private</access>
    <exportActions>true</exportActions>
  </innerComponent>
  <innerComponent>
    <kind>Computation</kind>
    <identifier>unpack_solve_info</identifier>
    <type>
      <componentName>bt.solve.UnpackSolveInfo</componentName>
      <publicInnerComponent>problem_data</publicInnerComponent>
      <publicInnerComponent>cells_info</publicInnerComponent>
      <publicInnerComponent>input_buffer_forward</publicInnerComponent>
      <publicInnerComponent>iteration_control_forward</publicInnerComponent>
      <publicInnerComponent>lhsc</publicInnerComponent>
      <parameter>
        <identifier>instance_type</identifier>
        <variable>I</variable>
        <constraint>
          <componentConstraint>common.problem_size.Instance</componentConstraint>
          <parameter>
            <identifier>class</identifier>
            <variable>C</variable>
            <constraint>
              <componentConstraint>common.problem_size.Class</componentConstraint>
            </constraint>
          </parameter>
        </constraint>
      </parameter>
      <parameter>
        <identifier>axis</identifier>
        <variable>DIR</variable>
        <constraint>
          <componentConstraint>common.axis.Axis</componentConstraint>
        </constraint>
      </parameter>
      <parameter>
        <identifier>class</identifier>
        <variable>C</variable>
        <constraint>
          <componentConstraint>common.problem_size.Class</componentConstraint>
        </constraint>
      </parameter>
      <parameter>
        <identifier>method</identifier>
        <variable>MTH</variable>
        <constraint>
          <componentConstraint>common.solve.SolvingMethod</componentConstraint>
        </constraint>
      </parameter>
    </type>
    <access>private</access>
    <exportActions>true</exportActions>
  </innerComponent>
  <innerComponent>
    <kind>Computation</kind>
    <identifier>solve_cell</identifier>
    <type>
      <componentName>bt.solve.SolverCell</componentName>
      <publicInnerComponent>problem_data</publicInnerComponent>
      <publicInnerComponent>cells_info</publicInnerComponent>
      <publicInnerComponent>iteration_control_forward</publicInnerComponent>
      <publicInnerComponent>lhsc</publicInnerComponent>
      <parameter>
        <identifier>instance_type</identifier>
        <variable>I</variable>
        <constraint>
          <componentConstraint>common.problem_size.Instance</componentConstraint>
          <parameter>
            <identifier>class</identifier>
            <variable>C</variable>
            <constraint>
              <componentConstraint>common.problem_size.Class</componentConstraint>
            </constraint>
          </parameter>
        </constraint>
      </parameter>
      <parameter>
        <identifier>axis</identifier>
        <variable>DIR</variable>
        <constraint>
          <componentConstraint>common.axis.Axis</componentConstraint>
        </constraint>
      </parameter>
      <parameter>
        <identifier>class</identifier>
        <variable>C</variable>
        <constraint>
          <componentConstraint>common.problem_size.Class</componentConstraint>
        </constraint>
      </parameter>
      <parameter>
        <identifier>method</identifier>
        <variable>MTH</variable>
        <constraint>
          <componentConstraint>common.solve.SolvingMethod</componentConstraint>
        </constraint>
      </parameter>
    </type>
    <access>private</access>
    <exportActions>true</exportActions>
  </innerComponent>
  <innerComponent>
    <kind>Synchronizer</kind>
    <identifier>shift_forward</identifier>
    <type>
      <componentName>common.interactionpattern.Shift</componentName>
      <publicInnerComponent>input_buffer_forward</publicInnerComponent>
      <publicInnerComponent>output_buffer_forward</publicInnerComponent>
      <publicInnerComponent>topology</publicInnerComponent>
      <publicInnerComponent>mpi</publicInnerComponent>
      <parameter>
        <identifier>direction</identifier>
        <constraint>
          <componentConstraint>common.direction.Forward</componentConstraint>
        </constraint>
      </parameter>
    </type>
    <access>private</access>
    <exportActions>true</exportActions>
  </innerComponent>
  <innerComponent>
    <kind>Synchronizer</kind>
    <identifier>shift_backward</identifier>
    <type>
      <componentName>common.interactionpattern.Shift</componentName>
      <publicInnerComponent>input_buffer_backward</publicInnerComponent>
      <publicInnerComponent>output_buffer_backward</publicInnerComponent>
      <publicInnerComponent>topology</publicInnerComponent>
      <publicInnerComponent>mpi</publicInnerComponent>
      <parameter>
        <identifier>direction</identifier>
        <constraint>
          <componentConstraint>common.direction.Backward</componentConstraint>
        </constraint>
      </parameter>
    </type>
    <access>private</access>
    <exportActions>true</exportActions>
  </innerComponent>
  <superComponent>
    <componentName>adi.Solver</componentName>
    <publicInnerComponent>cells_info</publicInnerComponent>
    <publicInnerComponent>problem_data</publicInnerComponent>
    <publicInnerComponent>topology</publicInnerComponent>
    <parameter>
      <identifier>axis</identifier>
      <variable>DIR</variable>
      <constraint>
        <componentConstraint>common.axis.Axis</componentConstraint>
      </constraint>
    </parameter>
    <parameter>
      <identifier>instance_type</identifier>
      <variable>I</variable>
      <constraint>
        <componentConstraint>common.problem_size.Instance</componentConstraint>
        <parameter>
          <identifier>class</identifier>
          <variable>C</variable>
          <constraint>
            <componentConstraint>common.problem_size.Class</componentConstraint>
          </constraint>
        </parameter>
      </constraint>
    </parameter>
    <parameter>
      <identifier>class</identifier>
      <variable>C</variable>
      <constraint>
        <componentConstraint>common.problem_size.Class</componentConstraint>
      </constraint>
    </parameter>
    <parameter>
      <identifier>method</identifier>
      <variable>MTH</variable>
      <constraint>
        <componentConstraint>common.solve.SolvingMethod</componentConstraint>
      </constraint>
    </parameter>
  </superComponent>
  <unit index="0" name="solve" parallel="true">
    <slice index="0" inner="cells_info" unit="cells"/>
    <slice index="0" inner="topology" unit="cell"/>
    <slice index="0" inner="problem_data" unit="problem"/>
    <slice index="0" inner="method" unit="method"/>
    <slice index="0" inner="axis" unit="axis"/>
    <slice index="0" inner="class" unit="class"/>
    <slice index="0" inner="instance" unit="instance"/>
    <slice index="0" inner="back_substitute" unit="back_substitute"/>
    <slice index="0" inner="solve_cell" unit="solve_cell"/>
    <slice index="0" inner="shift_forward" unit="shift"/>
    <slice index="0" inner="pack_back_sub_info" unit="pack_back_sub_info"/>
    <slice index="0" inner="pack_solve_info" unit="pack_solve_info"/>
    <slice index="0" inner="unpack_back_sub_info" unit="unpack_back_sub_info"/>
    <slice index="0" inner="unpack_solve_info" unit="unpack_solve_info"/>
    <slice index="0" inner="shift_backward" unit="shift"/>
    <action>
      <identifier>main</identifier>
      <protocol>
        <seq id="main" repeat="false">
          <action>
            <perform repeat="false" action_id="start" slice_id="iteration_control_forward"/>
          </action>
          <action>
            <perform repeat="false" action_id="go" slice_id="solve_cell"/>
          </action>
          <action>
            <seq id="iteration_control_forward.is_last_stage" repeat="true">
              <action>
                <perform repeat="false" action_id="go" slice_id="pack_solve_info"/>
              </action>
              <action>
                <perform repeat="false" action_id="initiate_send" slice_id="shift_forward"/>
              </action>
              <action>
                <perform repeat="false" action_id="advance" slice_id="iteration_control_forward"/>
              </action>
              <action>
                <perform repeat="false" action_id="initiate_recv" slice_id="shift_forward"/>
              </action>
              <action>
                <perform repeat="false" action_id="go" slice_id="shift_forward"/>
              </action>
              <action>
                <perform repeat="false" action_id="go" slice_id="unpack_solve_info"/>
              </action>
              <action>
                <perform repeat="false" action_id="go" slice_id="solve_cell"/>
              </action>
            </seq>
          </action>
          <action>
            <perform repeat="false" action_id="end" slice_id="iteration_control_forward"/>
          </action>
          <action>
            <perform repeat="false" action_id="start" slice_id="iteration_control_backward"/>
          </action>
          <action>
            <perform repeat="false" action_id="go" slice_id="back_substitute"/>
          </action>
          <action>
            <seq id="iteration_control_backward.is_first_stage" repeat="false">
              <action>
                <perform repeat="false" action_id="go" slice_id="pack_back_sub_info"/>
              </action>
              <action>
                <perform repeat="false" action_id="initiate_send" slice_id="shift_backward"/>
              </action>
              <action>
                <perform repeat="false" action_id="advance" slice_id="iteration_control_backward"/>
              </action>
              <action>
                <perform repeat="false" action_id="initiate_recv" slice_id="shift_backward"/>
              </action>
              <action>
                <perform repeat="false" action_id="go" slice_id="shift_forward"/>
              </action>
              <action>
                <perform repeat="false" action_id="go" slice_id="unpack_back_sub_info"/>
              </action>
              <action>
                <perform repeat="false" action_id="go" slice_id="back_substitute"/>
              </action>
            </seq>
          </action>
          <action>
            <perform repeat="false" action_id="end" slice_id="iteration_control_backward"/>
          </action>
        </seq>
      </protocol>
    </action>
  </unit>
</component:hashComponent>